#/usr/bin/perl
<<DOC; 
Votre Nom : 
JANVIER 2005
 usage : perl pourtreetaggervite.pl repertoire-a-parcourir rubrique
 Le programme prend en entrée le nom du répertoire contenant les fichiers
 à traiter et le numéro de la rubrique
 Programme spécial pour l'étiquetage de Treetagger uniquement
 Le programme construit en sortie un fichier structuré contenant sur chaque
 ligne le nom du fichier et le résultat du filtrage :
<FICHIER><NOM>du fichier</NOM></FICHIER><CONTENU>du filtrage</CONTENU></FICHIER>
DOC
#--------------------------------------------------- entrée du répertoire
use Unicode::String qw (utf8);
use XML::RSS;
use strict;
use warnings;
use XML::Entities;


my $rss=new XML::RSS;
my %dictionnairedesfils=();
my %dictionnairedescription=();
my $rub= "$ARGV[1]";
my $encodagesortie1="utf-8";
#-----------------------------------------------------------

my $rep="$ARGV[0]";
$rep=~ s/[\/]$//;

#----------------------------------------#préparation des fichiers de sortie
my $output1="SORTIE_$rub.rss.xml";
if (!open (OUT1,">:encoding($encodagesortie1)",$output1)) { die "Pb a l'ouverture du fichier $output1"};
print OUT1 "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
print OUT1 "<PARCOURS>\n";
print OUT1 "<NOM>BLANCHARD DUFOUR</NOM>\n";
print OUT1 "<FILTRAGE>\n";

#----------------------------------------
&parcoursarborescencefichiers($rep);
#----------------------------------------#fin des fichiers de sortie
print OUT1 "</FILTRAGE>\n";
print OUT1 "</PARCOURS>\n";
close(OUT1);
exit;


#---------------------------------------------- parcours d'arborescence
sub parcoursarborescencefichiers {
    my $path = shift(@_);
    opendir(DIR, $path) or die "can't open $path: $!\n"; 
    my @files = readdir(DIR);
    closedir(DIR);
    
    foreach my $file (@files) {
	next if $file =~ /^\.\.?$/;
	$file = $path."/".$file;
	if (-d $file) {
	    
	    &parcoursarborescencefichiers($file); #relance la procédure
	    
	}
	if (-f $file) {
	    
	    if (($file =~ /.+-$rub.+\.xml$/) and (-s $file !=0)){ 
	    
	        print $file,"\n";
		print OUT1 "<file>$file</file>\n";
	        
		open (FILE, $file); 
		    my $description=();
		    my $titre=();
		  
		    eval{$rss->parsefile($file);}; #vérifie que le document est bien formé et construit une nouvelle structure de données
			    foreach my $item (@{$rss->{'items'}}) {
			    my $titre=$item->{'title'};
			    my $description=$item->{'description'};
			    
			    
			    #---------------------------------- suppression des doublons
			    if (!(exists($dictionnairedesfils{$titre})) and !(exists($dictionnairedescription{$description}))) 
			    {
				$dictionnairedesfils{$titre}++;
				$dictionnairedescription{$description}++;
			    #--------------------------------- remplace les entités xml
				$titre=XML::Entities::decode('all', $titre);
				$description=XML::Entities::decode('all', $description);
			    #---------------------------------- procédure nettoyage
				$description=&nettoyage($description);
				$titre=&nettoyage($titre);    
			    #---------------------------------- procédure étiquetage
				($titre,$description)=&etiquetage($titre,$description);
			    #----------------------------------
  
			    
					print OUT1 "<item><title>$titre</title>\n<description>$description</description>\n</item>\n";
			        
			    }
			    else {
				print "Item déjà vu\n";
			    }
		    }
			    
		    close (FILE);	
			
			    
		    }
		}
		
	}
    }

#---------------------------------------------- nettoyage
sub nettoyage {
		my $chainetrouvee = shift@_;
		$chainetrouvee=~s /&#38;#39;/'/g;
		$chainetrouvee=~s /&#39;/'/g;
		$chainetrouvee=~s /&#38;#34;/"/g;
		$chainetrouvee=~s /&#34;/"/g;
		$chainetrouvee=~s /&#91;/[/g;
		$chainetrouvee=~s /&#93;/]/g;
		$chainetrouvee=~s /&#233;/é/g;
		$chainetrouvee=~s /e\x{0301}/é/g;
		$chainetrouvee=~s /e\x{0300}/è/g;
		$chainetrouvee=~s /&#234;/ê/g;
		$chainetrouvee=~s /\x{0119}/ę/g;
		$chainetrouvee=~s/\x{2192}/→/g;
		$chainetrouvee=~s/\x{201c}/"/g;
		$chainetrouvee=~s /âœ/"/g;
		$chainetrouvee=~s/\x{201d}/"/g;
		$chainetrouvee=~s /â/"/g;
		$chainetrouvee=~s /âÅ/"/g;
		$chainetrouvee=~s/\x{2019}/'/g;
		$chainetrouvee=~s/\x{2018}/'/g;
		$chainetrouvee=~s/\x{2013}/-/g;
		$chainetrouvee=~s/\x{2014}|â/-/g;
		$chainetrouvee=~s/\x{2212}/-/g; 
		$chainetrouvee=~s /\x{2026}/.../g;
		$chainetrouvee=~s /\x{0153}/oe/g;
		$chainetrouvee=~s /\x{0152}/Œ/g;
		$chainetrouvee=~s /\x{0096}/-/g;
		$chainetrouvee=~s /\x{009C}/oe/g;
		$chainetrouvee=~s /\x{0093}/oe/g;
		$chainetrouvee=~s /\x{200a}/ /g;
		$chainetrouvee=~s /\x{200b}/ /g;
		$chainetrouvee=~s /ÅÅ/oe/g;
		$chainetrouvee=~s /Å/oe/g;
		$chainetrouvee=~s /&/and/g;
		$chainetrouvee=~s /"/"/g;
		#$chainetrouvee=~s /â¯//g;
		$chainetrouvee=~s/\x{20ac}/€/g;
		$chainetrouvee=~s /\x{305a}\x{305a}\x{3063}\x{3068}/ずずっと/g;
		$chainetrouvee=~s/\x{2009}/ /g; #espace court
		$chainetrouvee=~s/\x{fffd}/�/g;
		$chainetrouvee=~s /&lt;.*?&gt;//g;
		$chainetrouvee=~s /<img.*?\/>//g;
		$chainetrouvee=~s /<a href.*?><\/a>//g;
		$chainetrouvee=~s /<p>&nbsp;&nbsp;\n<\/p>//g;
		$chainetrouvee=~s /<[^<]*>//g;
		return $chainetrouvee;
}

#------------------------------------------- etiquetage avec treetagger
sub etiquetage {
		my ($titre,$description)= @_;
		my $titreetiquete="";
		my $descriptionetiquete="";
		my $tmptag="texteetiquete.txt";
		
		#-------------- etiquetage de titre
		open (FIC, ">:encoding(utf8)", $tmptag);
		print FIC $titre;
		close (FIC);
		system ("perl ./tree-tagger/treetagger-win32/cmd/tokenise-utf8.pl $tmptag > tmptag.tok");
		system ("tree-tagger -token -lemma -no-unknown ./tree-tagger/treetagger-win32/lib/french-utf8.par tmptag.tok > tmptagt.tok");
		system ("perl ./tree-tagger/treetagger-win32/cmd/treetagger2xml-utf8.pl tmptagt.tok utf8");
		
		open (OUT, "<:encoding(utf8)", "tmptagt.tok.xml");
		my $firstline=<OUT>; #pour ne pas imprimer la ligne d'entête du fichier xml
		while (my $line=<OUT>) {
			$titreetiquete.=$line;
		}
		close (OUT);
		
		#-------------- etiquetage de description
		open (TMPFILE, ">:encoding(utf8)", $tmptag);
		print TMPFILE $description;
		close (TMPFILE);
		system ("perl ./tree-tagger/treetagger-win32/cmd/tokenise-utf8.pl $tmptag > tmptag.tok");
		system ("tree-tagger -token -lemma -no-unknown ./tree-tagger/treetagger-win32/lib/french-utf8.par tmptag.tok > tmptagd.tok");
		system ("perl ./tree-tagger/treetagger-win32/cmd/treetagger2xml-utf8.pl tmptagd.tok utf8");

		open (OUT, "<:encoding(utf8)", "tmptagd.tok.xml");
		my $firstline1=<OUT>;
		while (my $line1=<OUT>) {
			$descriptionetiquete.=$line1;
		}
		close (OUT);
		return ($titreetiquete,$descriptionetiquete);
}